package com.power.service.impl;

import com.alibaba.nacos.common.utils.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.power.constant.BusinessEnum;
import com.power.domain.Category;
import com.power.domain.Prod;
import com.power.domain.ProdTagReference;
import com.power.ex.handle.BussinessException;
import com.power.feign.SearchProdFeign;
import com.power.model.Result;
import com.power.service.SearchService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Description 搜索服务接口实现类
 * @Author dingchunlin
 * @Date 2024/07/21 16:50
 * @Version 1.0.0
 */
@Service
public class SearchServiceImpl implements SearchService {


    @Autowired
    private SearchProdFeign searchProdFeign;

    /**
     * 根据标签ID查询商品列表
     * @param current 页数
     * @param size    每页大小
     * @param tagId   标签ID
     * @return 商品列表
     */
    @Override
    public Page<Prod> queryWxProdListByTagId(Long current, Long size, Long tagId) {
        // 创建商品系的分页对象
        Page<Prod> prodPage = new Page<>(current, size);
        // 远程调用：根据分组标签分页查询商品与标签关系
        Result<Page<ProdTagReference>> result = searchProdFeign.getProdTagReferencePageByTagId(current, size, tagId);
        if (result.getCode().equals(BusinessEnum.OPERATION_FAIL.getCode())){
            throw new BussinessException("远程调用接口：根据分组标签分页查询商品与分组标签关系失败");
        }
        // 获取查询出来的对象
        Page<ProdTagReference> prodTagReferencePage = result.getData();
        // 获取记录
        List<ProdTagReference> prodTagReferencesList = prodTagReferencePage.getRecords();
        if (CollectionUtils.isEmpty(prodTagReferencesList) || prodTagReferencesList.size() == 0){
            return prodPage;
        }
        // 从商品id集合中获取商品id集合
        List<Long> prodIdList = prodTagReferencesList.stream().map(ProdTagReference::getProdId).collect(Collectors.toList());
        // 远程调用：根据商品id集合查询商品列表
        Result<List<Prod>> prodResult = searchProdFeign.getProdListByIds(prodIdList);
        if (prodResult.getCode().equals(BusinessEnum.OPERATION_FAIL.getCode())){
            throw new BussinessException("远程调用接口：根据商品id集合查询商品列表失败");
        }
        // 获取查询出来的商品列表
        List<Prod> prodList = prodResult.getData();
        // 设置商品列表到分页对象中
        prodPage.setRecords(prodList);
        // 设置总记录数
        prodPage.setTotal(prodTagReferencePage.getTotal());
        // 设置总页数
        prodPage.setPages(prodTagReferencePage.getPages());
        // 返回分页对象
        return prodPage;
    }

    /**
     * 根据分类ID查询商品列表
     * @param categoryId 分类ID
     * @return 商品列表
     */
    @Override
    public List<Prod> queryWxProdListByCategoryId(Long categoryId) {
        // 创建所有类目ID集合
        List<Long> categoryIdList = new ArrayList<>();
        // 添加父分类id
        categoryIdList.add(categoryId);
        // 远程调用，根据分类ID查询下面的子分类id集合
        Result<List<Category>> result = searchProdFeign.getCategoryListByParentId(categoryId);
        // 判断是否调用成功
        if (result.getCode().equals(BusinessEnum.OPERATION_FAIL.getCode())){
            throw new BussinessException("远程调用接口：根据分类ID查询下面的子分类id集合失败");
        }
        // 获取查询出来的子分类id集合
        List<Category> categoryList = result.getData();
        if (CollectionUtils.isNotEmpty(categoryList) && categoryList.size() > 0){
            List<Long> idList = result.getData().stream().map(Category::getCategoryId).collect(Collectors.toList());
            categoryIdList.addAll(idList);
        }
        // 远程调用，根据分类ID集合查询商品列表
        Result<List<Prod>> prodResult = searchProdFeign.loadProdListByCategoryIdList(categoryIdList);
        // 判断是否调用成功
        if (prodResult.getCode().equals(BusinessEnum.OPERATION_FAIL.getCode())){
            throw new BussinessException("远程调用接口：根据分类ID查询商品列表失败");
        }
        // 获取查询出来的商品列表
        List<Prod> prodList = prodResult.getData();
        // 返回商品列表
        return prodList;
    }

}
